package com.edmendst.xmall.service.impl;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.edmendst.xmall.dto.CallBackPayInFo;
import com.edmendst.xmall.mapper.AlipayLogMapper;
import com.edmendst.xmall.mapper.OrdersMapper;
import com.edmendst.xmall.pojo.AlipayLog;
import com.edmendst.xmall.pojo.Orders;
import com.edmendst.xmall.service.PayService;
import com.edmendst.xmall.service.UserService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Map;

@Service
public class PayServiceImpl implements PayService {

    @Value("${pay.privateKey}")
    private String APP_PRIVATE_KEY;

    @Value("${pay.publicKey}")
    private String ALIPAY_PUBLIC_KEY;

    @Value("${pay.appId}")
    private String APP_ID;


    @Autowired
    private UserService userService;
    @Autowired
    private OrdersMapper ordersMapper;
    @Autowired
    private AlipayLogMapper alipayLogMapper;

    /**
     * URL	支付宝网关（固定）	<a href="https://openapi.alipay.com/gateway.do">...</a>
     * APPID	APPID即创建应用后生成	获取见上面创建应用
     * APP_PRIVATE_KEY	开发者私钥，由开发者自己生成	获取详见上面配置密钥
     * FORMAT	参数返回格式，只支持json	json（固定）
     * CHARSET	编码集，支持GBK/UTF-8	开发者根据实际工程编码配置
     * ALIPAY_PUBLIC_KEY	支付宝公钥，由支付宝生成	获取详见上面配置密钥
     * SIGN_TYPE	商户生成签名字符串所使用的签名算法类型，目前支持RSA2和RSA，推荐使用RSA2	RSA2
     */
    @Override
    public ResponseEntity<String> payOrder(String orderId, BigDecimal orderTotalAmount, String userName) throws AlipayApiException {

        Integer userId = userService.selectUserIdByUserName(userName);

        //初始化SDK
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi-sandbox.dl.alipaydev.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "JSON", "utf-8", ALIPAY_PUBLIC_KEY, "RSA2");

        //构造请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//        request.setReturnUrl("https://your-domain.com/payment/return"); // 同步回调
//        request.setNotifyUrl("https://localhost:8080/payment/callback"); // 异步回调

        alipayRequest.setNotifyUrl("https://elv68fqluraj.ngrok.xiaomiqiu123.top/pay/callback"); // 异步回调地址
        alipayRequest.setReturnUrl("http://z5y8edt27b1l.ngrok.xiaomiqiu123.top/payment/success");// 同步回调地址

        AlipayTradePagePayModel model = new AlipayTradePagePayModel();

        //订单号
        model.setOutTradeNo(orderId);
        //订单金额
        model.setTotalAmount(orderTotalAmount.toString());
        //订单标题
        model.setSubject("订单支付：" + orderId);
        //支付宝产品码
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        //设置请求参数
        alipayRequest.setBizModel(model);


//        AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest);
//
//        System.out.println(response.getBody());
//
//        if (response.isSuccess()) {
//            System.out.println("调用成功");
//        } else {
//            System.out.println("调用失败");
//        }
//        return response.getBody();



//        AlipayTradePagePayResponse response = alipayClient.execute(alipayRequest);

        //    // 验证公钥格式
//    private static boolean isValidPublicKey(String publicKey) {
//        if (publicKey == null || !publicKey.contains("-----BEGIN PUBLIC KEY-----") || !publicKey.contains("-----END PUBLIC KEY-----")) {
//            return false;
//        }
//        return true;

        String form = alipayClient.pageExecute(alipayRequest).getBody();
        return ResponseEntity.ok(form); // 返回HTML表单

    }

    /**
     *
     * @param callBackPayInFo
     * 存储回调信息
     * @return 是否下单成功
     *
     *  * notify_time	Date	是	-	通知时间。通知的发送时间。格式为 yyyy-MM-dd HH:mm:ss。	2020-12-27 06:20:30
     *  * notify_type	String	是	64	通知类型。
     *  * 枚举值：trade_status_sync。	trade_status_sync
     *  * notify_id	String	是	128	通知校验 ID。	ac05099524730693a8b330c5ecf72da9786
     *  * sign_type	String	是	10	签名类型。商家生成签名字符串所使用的签名算法类型，目前支持 RSA2 和 RSA，推荐使用 RSA2（如果开发者手动验签，不使用 SDK 验签，可以不传此参数）。	RSA2
     *  * sign	String	是	344	签名。可查看异步返回结果的验签（如果开发者手动验签，不使用 SDK 验签，可以不传此参数）。	601510b7970e52cc63db0f44997cf70e
     *  * trade_no	String	是	64	支付宝交易号。支付宝交易凭证号。	20213112011001004330000121536
     *  * app_id	String	是	32	开发者的 app_id。支付宝分配给开发者的应用 APPID。	2014072300007148
     *  * auth_app_id	String	是	32	开发者的 app_id，在服务商调用的场景下为授权方的 app_id。	2014072300007148
     *  * out_trade_no	String	是	64	商户订单号。	6823789339978248
     *  * trade_status	String	是	32	交易状态。咨询目前所处的状态。	TRADE_CLOSED
     *  * total_amount	Number	是	11	订单金额。本次交易支付的订单金额，单位为人民币（元）。支持小数点后两位。	20
     *  * receipt_amount	Number	是	11	实收金额。商家在交易中实际收到的款项，单位为人民币（元）。支持小数点后两位。	15
     */
    @Transactional
    @Override
    public String callBackPay(Map<String, String> params, CallBackPayInFo callBackPayInFo) throws AlipayApiException {
        // 打印公钥
        System.out.println("ALIPAY_PUBLIC_KEY: " + ALIPAY_PUBLIC_KEY);

        // 支付宝签名验证
        System.out.println("验签参数: " + params);
        System.out.println("支付宝公钥: " + ALIPAY_PUBLIC_KEY);
        if (!AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2")) {
            System.out.println("验签失败原因: " + params.get("sign_type") + " | " + params.get("sign"));
            return "验签失败";
        }


        AlipayLog alipayLog = new AlipayLog();
        alipayLog.setAppId(callBackPayInFo.getAppId());
        alipayLog.setNotifyTime(callBackPayInFo.getNotifyTime());
        alipayLog.setOutTradeNo(callBackPayInFo.getOutTradeNo());
        alipayLog.setTradeNo(callBackPayInFo.getTradeNo());
        alipayLog.setTradeStatus(callBackPayInFo.getTradeStatus());//订单状态
        alipayLog.setTotalAmount(callBackPayInFo.getTotalAmount());

        // 存储原始回调数据
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String rawData = objectMapper.writeValueAsString(params);
            alipayLog.setRawData(rawData);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return "系统错误：无法序列化原始回调数据";
        }


        int i = alipayLogMapper.insert(alipayLog);
        if (i == 0) {
            return "数据库更新失败";
        }
        if (callBackPayInFo.getTradeStatus().equals("TRADE_SUCCESS")) {
            //更新订单状态
            Orders order = ordersMapper.selectByPrimaryKey(callBackPayInFo.getOutTradeNo());
            order.setOrderPaymentStatus(true);
            ordersMapper.updateByPrimaryKey(order);
            return "success";
        }
        return "fail";
    }
}
